package principal;

import heuristicas.*;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        byte[][] p1 = {
            {1, 12, 11, 10},
            {0, 2, 13, 8},
            {5, 4, 9, 15},
            {3, 6, 14, 7}
        };
        Vertice v1 = new Vertice(p1);

        byte[][] p2 = {
            {1, 9, 10, 11},
            {12, 3, 13, 8},
            {4, 15, 6, 14},
            {5, 2, 0, 7}
        };
        Vertice v2 = new Vertice(p2);

        byte[][] p3 = {
            {1, 11, 10, 9},
            {0, 6, 12, 13},
            {3, 14, 2, 15},
            {4, 5, 7, 8}
        };
        Vertice v3 = new Vertice(p3);

        byte[][] p4 = {
            {1, 11, 10, 15},
            {3, 8, 13, 6},
            {12, 0, 4, 5},
            {2, 9, 14, 7}
        };
        Vertice v4 = new Vertice(p4);

        byte[][] p5 = {
            {2, 10, 9, 14},
            {11, 5, 1, 8},
            {3, 15, 13, 4},
            {6, 12, 0, 7}
        };
        Vertice v5 = new Vertice(p5);

        byte[][] pFinal = {
            {1, 12, 11, 10},
            {2, 13, 0, 9},
            {3, 14, 15, 8},
            {4, 5, 6, 7}
        };
        Vertice vFinal = new Vertice(pFinal);

        Heuristica h1 = new H1();
        Heuristica h2 = new H2();
        Heuristica h3 = new H3();
        Heuristica h4 = new H4();
        Heuristica h5 = new H5();

        long antes = System.currentTimeMillis();

        imprimeCaminho(new AStar(h3).caminho(v3, vFinal));

        long depois = System.currentTimeMillis();
        double tempo = (depois - antes) / 1000.;
        System.out.println("Tempo = " + tempo + " s");
    }

    private static void imprimeCaminho(List<Vertice> caminho) {
        if (caminho == null) {
            System.out.println("Não há solução para este puzzle.");
        } else {
            int movimentos = caminho.size() - 1;

            for (Vertice v : caminho) {
                System.out.println(v);
            }

            System.out.println("---------------");
            System.out.println("Movimentos = " + movimentos);
        }
    }
}
